iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
Security

picoCTF 刷題分享系列 第 25

picoCTF 刷題分享---Day 25(刷題去)

  • 分享至 

  • xImage
  •  

解開昨天的那一題時,是真的好爽阿!!! 今天在想到時還是覺得很爽🤣🤣🤣


題目:Classic Crackme 0x100
解題思路

  • 看到最顯眼的地方:
  • strcpy(output, "mpknnphjngbhgzydttvkahppevhkmpwgdzxsykkokriepfnrdm");
  • 這代表的是output = "mpknnphjngbhgzydttvkahppevhkmpwgdzxsykkokriepfnrdm";
  • 看名字也知道,他要做的事情是會經過一堆運算後要等於output
  • 所以我們要做的事,就是逆著做 output -> reverse -> input[51] (題目有說)
  • 所以我們要搞清楚的就是while loop 到底在幹嘛
  • 首先會知道while loop 會跑三遍(i = 0; i <= 2; ++i) (代表會連續進行三次的加密)
  • 再看到for ( i_0 = 0; i_0 < len; ++i_0 ) -> len是output的長度 == input的長度
  • 所以可以知道for loop 在做的事就是加密了,那現在來細看一下
    https://ithelp.ithome.com.tw/upload/images/20241009/20164155bG8lbw6Bo2.png
  • 看第一行,拆成兩部分
    • (secret1 & (i_0 % 255))
      • 這部分可知(i_0 % 255)的範圍是0~254
      • secret1固定為85
      • 不需要去了解它想要幹嘛,因為它的目的只是產生一個隨機數
      • 我們要做的就只是逆向而已
    • (secret1 & ((i_0 % 255) >> 1))
      • 可知(i_0 % 255) >> 1)的範圍是0~127(0/2~254/2 )
      • secret1一樣固定為85
  • 說這麼多,反正這東西到最後會產生一個int random1
  • 第二部分:
    • 使用第一行的值對secret2再次加密
    • 與上個方法很像都是做bitwise AND(&)
    • (random1 & secret2) +
    • (secret2 & (random1 >> 2)) (== (secret2 & (random1 / (2^2==4)))
  • input[i_0] = ((random2 & secret3) + input[i_0] - fix + (secret3 & (random2 >> 4))) % 26 + fix;
    • (random2 & secret3)
      • secret3 的值是 15 (二進制為 00001111)
      • 所以會保留後四位的值(去掉前四位)
    • (random2 >> 4)
      • random2 向右位移四位
    • (secret3 & (random2 >> 4))
      • 將右移後的 random2 和 secret3做bitwise AND,同樣保留了 random2 的前四位
  • 所以對他做逆向就會很輕鬆啦
  • 寫一個res.py
def decrypt(output):
    secret1 = 85
    secret2 = 51
    secret3 = 15
    fix = 97
    output = list(output)
    len_output = len(output)
    
    for _ in range(3):  
        for i_0 in range(len_output):
            random1 = (secret1 & (i_0 % 255)) + (secret1 & ((i_0 % 255) >> 1))
            random2 = (random1 & secret2) + (secret2 & (random1 >> 2))
            output[i_0] = chr(((ord(output[i_0]) - fix - (random2 & secret3) - (secret3 & (random2 >> 4))) % 26) + fix)
    
    return ''.join(output)

output = "mpknnphjngbhgzydttvkahppevhkmpwgdzxsykkokriepfnrdm"
password = decrypt(output)
print("Decrypted password:", password)
  • 即可獲得input啦!!
  • 再把你獲得的flag丟到nc就可以獲得真正的flag
  • 格式:picoCTF{flag.content}

後記:
還有兩分鐘挑戰失敗,真刺激


上一篇
picoCTF 刷題分享---Day24(刷題去)
下一篇
picoCTF 刷題分享---Day 26(ELF理論補足)
系列文
picoCTF 刷題分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言